package com.jumi.microservice.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jumi.microservice.domain.ClearSkuMaterialDTO;
import com.jumi.microservice.domain.GoodsSkuStockDTO;
import com.jumi.microservice.domain.*;
import com.jumi.microservice.domain.GoodsQuery;
import com.jumi.microservice.stock.dto.commodity.CommodityApplyDTO;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 商品管理service组件接口
 *
 * @author Administrator
 */
public interface GoodsService {

    /**
     * 分页查询标签绑定的商品
     *
     * @param labelId 标签ID
     * @return 商品列表
     */
    List<GoodsDTO> listGoodsByLabelId(Long labelId);

    /**
     * 商品搜索
     *
     * @param goodsSearchQuery 商品查询条件
     * @return 商品DTO值对象集合
     */
    List<GoodsDTO> searchGoodsByPage(GoodsSearchQuery goodsSearchQuery, boolean isFront);

    /**
     * 商品分页查询
     *
     * @param goodsQuery 商品查询条件
     * @return 商品DTO集合
     */
    List<GoodsShowDTO> listGoodsByPage(GoodsQuery goodsQuery);

    /**
     * 根据id查询商品
     *
     * @param id 商品id
     * @return 商品
     */
    GoodsDTO getGoodsById(Long id);

    /**
     * 根据id查询商品
     *
     * @param id 商品id
     * @return 商品
     */
    GoodsDTO getGoodsDetailById(Long id);

    /**
     * 新增商品
     *
     * @param goods   商品
     * @param request request
     * @return 商品id
     */
    List<GoodsSkuDTO> addGoods(GoodsDTO goods, HttpServletRequest request);

    /**
     * 更新商品
     *
     * @param goods   商品
     * @param request request
     * @return 处理结果
     */
    List<GoodsSkuDTO> updateGoods(GoodsDTO goods, HttpServletRequest request);

    /**
     * 执行上架操作
     *
     * @param goodsId 商品id
     * @param request request
     * @return 处理结果
     */
    Boolean putOnShelves(Long goodsId, HttpServletRequest request);

    /**
     * 执行下架操作
     *
     * @param goodsId 商品id
     * @param request request
     * @return 处理结果
     */
    Boolean pullOffShelves(Long goodsId, HttpServletRequest request);

    /**
     * 执行删除操作
     *
     * @param goodsId 商品id
     * @param request request
     */
    void deleteGoods(String goodsId, HttpServletRequest request);

    /**
     * 商品列表页面获取厂家名称下拉列表
     *
     * @return 厂家名称列表
     */
    List<SupplierDTO> listSupplier();

    /**
     * 获取定时上架调度的商品
     *
     * @return 定时上架调度的商品列表
     */
    List<GoodsScheduleDTO> getScheduleGoods();

    /**
     * 更新调度状态
     *
     * @param goodsScheduleDTO 定时上架调度的商品
     */
    void updateGoodsScheduleStatus(GoodsScheduleDTO goodsScheduleDTO);

    /**
     * 根据商品SPU id 获取sku id集合
     *
     * @param id 商品SPU id
     * @return List<Long> sku id集合
     */
    List<Long> getSkuIdListBySpuId(Long id);

    /**
     * 根据商品SPU id 集合获取sku id集合
     *
     * @param ids 商品SPU id集合
     * @return List<Long> sku id集合
     */
    List<Long> getSkuIdListBySpuIds(List<Long> ids);

    /**
     * 添加库存 - 获取sku列表
     *
     * @param id 商品主键id
     * @return GoodsSkuStockDTO
     */
    List<GoodsSkuStockDTO> skuStockList(Long id);

    /**
     * 清除库存
     *
     * @param id 商品skuid
     * @return ClearSkuSpplyDTO
     */
    ClearSkuMaterialDTO clearInventory(Long id);

    /**
     * 分类获取商品
     *
     * @param categoryId 分类id
     * @param page       分页
     * @param size       条数
     * @return
     */
    IPage<GoodsDO> goodsListByCategoryId(Long categoryId, Integer page, Integer size);

    /**
     * 获取sku的物料id集合
     *
     * @param id spuid
     * @return
     */
    List<Long> selectSkuIdsBySpuId(Long id);

    /**
     * 封装供应链接口dto
     *
     * @param commodityApplyDTO 供应链dto
     * @param vo                sku库存信息
     * @return
     */
    CommodityApplyDTO encapsulationStock(CommodityApplyDTO commodityApplyDTO, SkuSupplyAddVO vo);

    /**
     * 查询商品信息
     *
     * @param ids supid
     * @return 商品DTO值对象集合
     */
    List<GoodsDTO> goodsListBySpuId(List<Long> ids);


    /**
     * 查询商品信息
     *
     * @param goodsName 商品名
     * @return 商品DTO值对象集合
     */
    List<GoodsDTO> searchGoodsByGoodsNameDrop(String goodsName);

    /**
     * 查询组合商品的物料信息
     *
     * @param id spuid
     * @return
     */
    GoodsMateriaDTO selectCombinationSkuIdsBySpuId(Long id);

    /**
     * 获取商品的sku信息及id集合
     *
     * @param spuId 商品spuid
     * @return
     */
    GoodsSkuStockIdDTO getGoodsSkuAndIdsBySpuId(Long spuId);

    /**
     * 订单-预售转真实业务日志
     *
     * @param log
     */
    void addPre2RealStockLog(OrderStockLog log);

    /**
     * 预售转真实 日志列表
     *
     * @param page
     * @param log
     * @return
     */
    IPage<OrderStockLog> stockLogPage(Page page, OrderStockLog log);


    /**
     * 查询所有已经上架状态商品
     * @param goodsQuery
     * @return
     */
    List<GoodsShowDTO> releaseListGoods(GoodsQuery goodsQuery);
}
